package com.puboot.common.util;

import java.math.BigDecimal;
import java.util.List;

/**
 * 纺织企业
 * Created by chen on 2021/12/16.
 */
public class SpinUtil {

    /**
     * 计算 温室气体排放总量，单位为t
     *
     * @param eBurn             燃料燃烧二氧化碳排放量，单位为t
     * @param eProcess          过程二氧化碳排放量，单位为t
     * @param eWasteWater       废水处理温室气体排放量，单位为t
     * @param ePurchaseElectric 购入电力对应的二氧化碳排放量，单位为t
     * @param ePurchaseHeat     购入热力对应的二氧化碳排放量，单位为t
     * @param eOutputElectric   输出电力对应二氧化碳排放量，单位为t
     * @param eOutputHeat       输出热力对应二氧化碳排放量，单位为t
     * @return
     */
    public static Double getE(Double eBurn, Double eProcess, Double eWasteWater,
                              Double ePurchaseElectric, Double ePurchaseHeat, Double eOutputElectric,
                              Double eOutputHeat) {
        BigDecimal eOutputElectricB = new BigDecimal(eOutputElectric);
        BigDecimal eOutputHeatB = new BigDecimal(eOutputHeat);
        BigDecimal jsgc1 = GasDCUtil.allAdd(eBurn, eProcess, eWasteWater, ePurchaseElectric, ePurchaseHeat);
        BigDecimal jsgc2 = jsgc1.subtract(eOutputElectricB);
        BigDecimal jsgc3 = jsgc2.subtract(eOutputHeatB);
        return jsgc3.doubleValue();
    }

    /**
     * 计算 燃料燃烧排放量
     *
     * @param ncvs 第i种化石燃料的平均低位发热量，对固体和液体燃料以GJ/t为单位，对气体燃料以GJ /104Nm3为单位
     * @param fcs  第i种化石燃料的净消耗量，对固体和液体燃料以t为单位，对气体燃料以104Nm3为单位
     * @param ccs  第i种化石燃料的单位热值含碳量，单位为t/GJ
     * @param ofs  第i种化石燃料的碳氧化率，单位为%
     * @return
     */
    public static Double getEBurn(List<String> ncvs, List<String> fcs, List<String> ccs, List<String> ofs) {
        BigDecimal result = new BigDecimal(0.0);
        BigDecimal cl2B = new BigDecimal(12);
        for (int i = 0; i < ncvs.size(); i++) {
            BigDecimal jsgc1 = GasDCUtil.allMul(Double.valueOf(ncvs.get(i)), Double.valueOf(fcs.get(i)),
                    Double.valueOf(ccs.get(i)), Double.valueOf(ofs.get(i)), 44.0);
            result = result.add(jsgc1.divide(cl2B, 10, BigDecimal.ROUND_HALF_UP));
        }
        return result.doubleValue();
    }

    /**
     * 计算 过程二氧化碳排放量，单位为t
     *
     * @param fCarbonates 第i种碳酸盐的消耗量，单位为t
     * @param fis         第i种碳酸盐的纯度，单位为%
     * @param mCarbonates 第i种碳酸盐的相对分子质量
     * @return
     */
    public static Double getEProcess(List<String> fCarbonates, List<String> fis, List<String> mCarbonates) {
        BigDecimal result = new BigDecimal(0.0);
        for (int i = 0; i < fCarbonates.size(); i++) {
            BigDecimal jsgc = GasDCUtil.allMul(Double.valueOf(fCarbonates.get(i)), Double.valueOf(fis.get(i)), 44.0);
            BigDecimal mCarbonateB = new BigDecimal(mCarbonates.get(i));
            BigDecimal jsgc1 = jsgc.divide(mCarbonateB, 10, BigDecimal.ROUND_HALF_UP);
            result = result.add(jsgc1);
        }
        return result.doubleValue();
    }

    /**
     * 计算 废水处理温室气体排放量，单位为t
     *
     * @param w      厌氧处理的废水量，单位为m3
     * @param codin  厌氧处理系统进口废水的每立方米千克化学需氧量，单位为kg/m3
     * @param codout 厌氧处理系统出口废水的每立方米千克化学需氧量，单位为kg/m3
     * @param r      甲烷回收量，单位为t
     * @return
     */
    public static Double getEWasteWater(Double w, Double codin, Double codout, Double r) {
        BigDecimal cl1 = new BigDecimal(0.000075);
        BigDecimal cl2 = new BigDecimal(21);
        BigDecimal wB = new BigDecimal(w);
        BigDecimal codinB = new BigDecimal(codin);
        BigDecimal codoutB = new BigDecimal(codout);
        BigDecimal rB = new BigDecimal(r);
        BigDecimal jsgc1 = codinB.subtract(codoutB);
        BigDecimal jsgc2 = wB.multiply(jsgc1).multiply(cl1);
        BigDecimal jsgc3 = jsgc2.subtract(rB);
        BigDecimal jsgc4 = jsgc3.multiply(cl2);
        return jsgc4.doubleValue();
    }

    /**
     * 计算 购入的电力消费的排放量，单位为t
     *
     * @param adPurchaseElectric 年度内的购入电量，单位为MWh
     * @param efPurchaseElectric 区域电网年平均供电因子，单位为t/MWh
     * @return
     */
    public static Double getEPurchaseElectric(Double adPurchaseElectric, Double efPurchaseElectric) {
        return GasDCUtil.allMul(adPurchaseElectric, efPurchaseElectric).doubleValue();
    }

    /**
     * 计算 购入的热力消费的排放量，单位为t 或者 输出的热力排放量，单位为t
     *
     * @param adPurchaseHeatOrAdOutInputHeat 年度内的外购热力，单位为GJ    年度内的输出热力，单位为GJ
     * @return
     */
    public static Double getEPurchaseHeatOrEOutputHeat(Double adPurchaseHeatOrAdOutInputHeat) {
        return GasDCUtil.allMul(0.11, adPurchaseHeatOrAdOutInputHeat).doubleValue();
    }

    /**
     * 计算 输出的电力排放量，单位为t
     *
     * @param adOutInputElectric 年度内的输出电量，单位为MWh
     * @param efOutInputElectric 区域电网年平均供电因子，单位为t/MWh
     * @return
     */
    public static Double getEOutputElectric(Double adOutInputElectric, Double efOutInputElectric) {
        return GasDCUtil.allMul(adOutInputElectric, efOutInputElectric).doubleValue();
    }
}
